from PIL import Image
from io import BytesIO

from django.db import models
from django.utils import timezone
from django.core.files.base import ContentFile

# Create your models here.
class Category(models.Model):
    # 分类信息
    name = models.CharField(max_length=128, verbose_name='分类名')  # 分类名

    class Meta:
        db_table = 'category'  # 数据库表名
        verbose_name = '分类'  # 在Admin后台显示的单个对象的名称
        verbose_name_plural = '分类'  # 在Admin后台显示的对象列表的名称
        ordering = ['name']  # 添加默认排序（按名称升序）

    def __str__(self):
        return self.name  # 返回对象的字符串表示形式，即分类名


class Book(models.Model): # 书籍表
    id = models.AutoField(primary_key=True)  # 自增主键
    category = models.ForeignKey(Category,verbose_name='分类名', blank=True, on_delete=models.CASCADE, default=1)  # 分类名，外键，可选
    name = models.CharField(verbose_name="书名", max_length=128) # 书名
    rate = models.FloatField(verbose_name='评分', blank=True, null=True)  # 评分，可选
    create_time = models.DateTimeField(verbose_name="创建时间", blank=True, default=timezone.now) # 创建时间，可选
    update_time = models.DateTimeField(verbose_name="更新时间", blank=True, auto_now=True) # 更新时间，每次保存时自动设置为当前时间，可选
    review = models.TextField(verbose_name="简介", blank=True, default="无") # 简介，可选
    cover_image = models.ImageField(
        verbose_name='封面图片',
        upload_to='covers/%Y/%m/%d/',  # 按日期分目录存储
        blank=True,
        null=True
    )
    is_published = models.BooleanField(verbose_name="是否发布", blank=True, default=False)  # 小说是否发布，
    is_hot = models.BooleanField(verbose_name='是否热门', default=False)  # 是否热门
    is_top = models.BooleanField(verbose_name='是否置顶', default=False)  # 是否置顶
    is_free = models.BooleanField(verbose_name='是否免费', default=True)  # 是否免费

    def save(self, *args, **kwargs):
        if self.cover_image:
            img = Image.open(self.cover_image)
            
            # 计算目标尺寸（强制4:5）
            target_width = 800
            target_height = 1000

            # 执行缩放+变形
            img = img.resize(
                (target_width, target_height),
                Image.Resampling.LANCZOS  # 高质量缩放算法
            )

            # 保存处理后的图片
            output = BytesIO()
            img.save(output, format='JPEG', quality=90)
            output.seek(0)
            
            self.cover_image.save(
                self.cover_image.name,
                ContentFile(output.read()),
                save=False
            )

        super().save(*args, **kwargs)

    class Meta:
        db_table = 'book'  # 数据库表名
        verbose_name = '书籍'  # 在Admin后台显示的单个对象的名称
        verbose_name_plural = '书籍'  # 在Admin后台显示的对象列表的名称
        ordering = ['-create_time']  # 按创建时间降序（最新优先）

    def __str__(self):
        return self.name  # 返回对象的字符串表示形式，即文章标题


class Article(models.Model):  # 文章表
    id = models.AutoField(primary_key=True) # 自增主键
    book = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name="所属书籍")  # 外键关联书籍表
    title = models.CharField(verbose_name="标题", max_length=128) # 文章标题
    content = models.TextField(verbose_name="正文", blank=True) # 文章正文
    create_time = models.DateTimeField(verbose_name="创建时间", blank=True, default=timezone.now) # 创建时间，可选
    update_time = models.DateTimeField(verbose_name="更新时间", blank=True, auto_now=True) # 更新时间，每次保存时自动设置为当前时间，可选

    class Meta:
        db_table = 'article'  # 数据库表名
        verbose_name = '文章'  # 在Admin后台显示的单个对象的名称
        verbose_name_plural = '文章'  # 在Admin后台显示的对象列表的名称

    def __str__(self):
        return self.title  # 返回对象的字符串表示形式，即文章标题
